package net.lesscoding.producer;

import net.lesscoding.common.Const;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;

import java.util.List;

/**
 * @author eleven
 * @date 2023/10/16 22:00
 * @apiNote 顺序消息生产者
 */
public class OrderProducer {
    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("pg");
        producer.setNamesrvAddr(Const.TS_NAME_SRV_ADDR_OS1);
        // 全局设置queue的数量
        producer.setDefaultTopicQueueNums(1);
        producer.start();
        Message msg = null;
        for (int orderId = 0; orderId < 100; orderId++) {
            byte[] body = String.format("Hi, %d", orderId).getBytes();
            msg = new Message("TopicA", "TagA", body);
            // 将orderId作为消息key
            msg.setKeys(String.valueOf(orderId));
            // send() 的第三个参数值会传递给选择器的select()的第三个参数
            // 这个send为同步发送
            SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
                /**
                 * 具体的选择算法在该方法之中定义
                 * @param list
                 * @param message
                 * @param arg
                 * @return
                 */
                @Override
                public MessageQueue select(List<MessageQueue> list, Message message, Object arg) {
                    // 以下使用arg作为选择key的算法
                    // int index = Integer.valueOf(arg.toString()) % list.size();
                    // 以下使用message的keys选择
                    String keys = message.getKeys();
                    Integer id = Integer.parseInt(keys);
                    int index = id % list.size();
                    return list.get(index);
                }
            }, orderId);

            System.out.println(sendResult);
        }
        producer.shutdown();
    }
}
